package org.Yiran.timetale_re.item.rune.type.functional;

import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.Yiran.timetale_re.item.rune.base.RuneItem;
import org.Yiran.timetale_re.item.rune.type.functional.base.FunctionalRune;
import org.Yiran.timetale_re.weather.StormWeatherData;
import org.Yiran.timetale_re.weather.manager.WindyWeatherManager;

/**
 * 风暴符文实现类
 * <p>
 * 该类实现了具体的功能类符文——风暴符文。
 * 当玩家使用风暴符文时，会在世界中触发持续10分钟的风暴天气效果，
 * 包括降雨、雷暴和强风效果。这是功能类符文的一个具体实现，
 * 继承自FunctionalRune基类。
 * </p>
 */
public class StormRune extends FunctionalRune {

    // ==============================
    // 常量定义
    // ==============================
    
    /**
     * 风暴持续时间（以游戏刻为单位，20游戏刻 = 1秒）
     * <p>
     * 设置为12000游戏刻，即10分钟的持续时间。
     * 在这段时间内，世界将维持风暴天气效果。
     * </p>
     */
    private static final int STORM_DURATION = 12000; // 10分钟

    /**
     * 冷却时间（以游戏刻为单位）
     * <p>
     * 设置为6400游戏刻，即320秒（约5分20秒）的冷却时间。
     * 玩家需要等待这段时间后才能再次使用风暴符文。
     * </p>
     */
    private static final int COOLDOWN_TIME = 6400; // 320秒

    // ==============================
    // 构造方法
    // ==============================
    
    /**
     * 风暴符文构造函数
     * <p>
     * 创建一个风暴符文实例，设置符文类型为RuneItem.STORM，
     * 并指定自定义冷却时间为320秒。
     * </p>
     */
    public StormRune() {
        super(RuneItem.STORM, COOLDOWN_TIME); // 使用320秒冷却时间
    }

    // ==============================
    // 符文效果实现
    // ==============================
    
    /**
     * 执行具体的符文效果
     * <p>
     * 实现了风暴符文的具体效果：
     * 1. 设置风暴开始时间和持续时间
     * 2. 激活风暴和大风标志
     * 3. 设置随机风力等级
     * 4. 设置原版天气为雷暴（会同时有雨和雷）
     * 这个方法在飞行符文实体完成飞行轨迹后由父类调用。
     * </p>
     *
     * @param stack  符文物品堆，包含具体符文信息的物品实例
     * @param level  当前世界对象，提供游戏环境上下文
     * @param player 使用符文的玩家对象
     */
    @Override
    public void executeRuneEffect(ItemStack stack, Level level, Player player) {
        // 确保只在服务端执行
        if (level.isClientSide() || !(level instanceof ServerLevel serverLevel)) {
            return;
        }

        // 获取天气数据管理器
        StormWeatherData weatherData = StormWeatherData.get(serverLevel);

        long currentTime = serverLevel.getGameTime();

        // 设置风暴开始时间和持续时间
        weatherData.setStormStartTime(currentTime);
        weatherData.setStormDuration(STORM_DURATION);

        // 同时激活风暴和大风标志
        weatherData.setStormy(true);
        weatherData.setWindy(true);

        // 随机设置风力等级（使用默认的权重系统生成1-9级风）
        int windLevel = getRandomWindLevelByRarity();
        weatherData.setWindLevelWithIntensity(windLevel);
        weatherData.setWindIntensity((float) windLevel);

        // 设置原版天气为雷暴（会同时有雨和雷）
        serverLevel.setWeatherParameters(0, STORM_DURATION, true, true);
    }

    // ==============================
    // 辅助方法
    // ==============================
    
    /**
     * 检查当前是否有风暴符文相关的天气效果
     * <p>
     * 用于检测当前世界是否正处于由风暴符文触发的天气效果期间。
     * 通过检查天气数据管理器中的状态和时间来判断。
     * </p>
     *
     * @param level 当前世界对象，提供游戏环境上下文
     * @return 如果有风暴天气返回true，否则返回false
     */
    public static boolean isStormActive(Level level) {
        if (level.isClientSide() || !(level instanceof ServerLevel serverLevel)) {
            return false;
        }

        StormWeatherData weatherData = StormWeatherData.get(serverLevel);
        long currentTime = serverLevel.getGameTime();

        // 检查是否处于风暴期间
        return weatherData.isStormy() &&
               weatherData.isWindy() &&
               currentTime < weatherData.getStormEndTime();
    }

    /**
     * 根据稀有度权重生成风力等级
     * <p>
     * 使用预定义的权重系统生成1-9级风力等级，等级越高，生成概率越低。
     * 这确保了风暴的真实性和平衡性。
     * </p>
     *
     * @return 1-9级风力等级
     */
    private static int getRandomWindLevelByRarity() {
        return WindyWeatherManager.getRandomWindLevelByRarity();
    }
}